home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / proasm / routines / startup4.r < prev    next >
Text File  |  1995-02-02  |  19KB  |  972 lines

  1.  
  2. ;---;  startup.r  ;------------------------------------------------------------
  3. *
  4. *    ****    ENHANCED CLI AND WORKBENCH STARTUP WITH DETACH    ****
  5. *
  6. *    Author        Stefan Walter
  7. *    Version        1.16c
  8. *    Last Revision    16.10.93
  9. *    Identifier    cws_defined
  10. *       Prefix        cws_    (cli and workbench startup)
  11. *                 ¯       ¯         ¯
  12. *    Functions    AutoDetach, ReplySync, ReplyWBMsg
  13. *
  14. *    Flags        cws_DETACH set 1      : when detaching startup
  15. *            cws_V36PLUSONLY set 1 : when tool for KS2.0 only
  16. *            cws_V37PLUSONLY set 1 : when tool for KS2.0/V37 only
  17. *            cws_CLIONLY set 1     : when tool for CLI usage only
  18. *            cws_PRI equ [pri]     :    if process must have priority
  19. *                            [pri] otherwise the priority
  20. *                            is inherited.
  21. *            cws_FPU set 1         : if FPU reset needed
  22. *            cws_EASYLIB set 1     : if libs to be opened by startup
  23. *            cws_STACKSIZE equ [stacksize] : if process must have a
  24. *                            stacksize of [stacksize]
  25. *                            otherwise the stacksize of the
  26. *                            parent process is taken.
  27. *
  28. *     NOTE:    The startup code must be in the first code segment, along with
  29. *        the other routines it accesses.
  30. *
  31. ;------------------------------------------------------------------------------
  32. *
  33. * Using this include: The main code must contain the symbols 'processname',
  34. * 'clistartup' and 'wbstartup'. The Main program must execute 'JMP AutoDetach'.
  35. * The child process can call ReplySync with a routine in a0. This routine gets
  36. * executed by the parent process under permitted conditions. The child process
  37. * *MUST* call ReplySync once with a0:=0. It waits then for a final message from
  38. * the parent process, which is sent by this under forbid. This guarantees
  39. * that the parent process ends in any case before the child because the memory
  40. * belongs to the child from the moment it recieves the first messy. The parent
  41. * process terminates under forbid.
  42. *
  43. ;------------------------------------------------------------------------------
  44.  
  45. ;------------------
  46.     ifnd    cws_defined
  47. cws_defined    =1
  48.  
  49. ;------------------
  50. cws_oldbase    equ __base
  51.     base    cws_base
  52. cws_base:
  53.  
  54. ;------------------
  55.  
  56. ;------------------------------------------------------------------------------
  57. *
  58. * AutoDetach    Standard startup code.
  59. *
  60. * RESULT:    If the program was started on workbench, this routine gets the
  61. *        workbench message in d0 and jumps to 'WBSTARTUP'. In case of
  62. *        CLI start, this routine autodetaches from the process and the
  63. *        new process starts at 'CLISTARTUP'. A message is sent to the
  64. *        new process to synchronize its creation with the end of the old
  65. *        process. In the message, a routine can be designed to be
  66. *        executed. The label 'PROCESSNAME' points to name.
  67. *
  68. *        The following variables can be accessed by the customer:
  69. *
  70. *        - cws_kick20.b        -1 if V36+, else 0
  71. *        - cws_kick30.b        -1 if V39+, else 0
  72. *        - cws_wbstartup.b    -1 for WB, 0 for CLI
  73. *        - cws_wbmessage.l    Pointer to WB message
  74. *        - cws_launchtask    Pointer to parent task structure
  75. *        - cws_returnvalue    Return value for parent process
  76. *
  77. ;------------------------------------------------------------------------------
  78.  
  79.         IFD     cws_V37PLUSONLY
  80. cws_V36PLUSONLY    SET    1
  81.     ENDIF
  82.  
  83. ;------------------
  84. AutoDetach:
  85.  
  86. ;------------------
  87. ; Get main base and save startup regs for capturing CLI.
  88. ;
  89. \start:
  90.     pea    (a4)
  91.     lea    cws_base(pc),a4
  92.     movem.l    d0-a6,cws_regs(a4)
  93.     move.l    (sp)+,cws_regs+12*4(a4)
  94.     move.l    4.w,a6
  95.  
  96.     IFD    cws_FPU
  97. ;------------------
  98. ; Reset FPU.
  99. ;
  100. \resetfpu:
  101.     MC68882
  102.     move.w    296(a6),d0
  103.     moveq    #$30,d1
  104.     btst    #3,d0        ;68040?
  105.     beq.s    \noforty
  106.     moveq    #$70,d1
  107. \noforty:
  108.     and.w    d1,d0
  109.     beq.s    \findtask
  110.     fmove.l    #0,fpcr
  111.     opt    p=-68882
  112.     ENDIF
  113.  
  114. ;------------------
  115. ; Get task and test if run from WorkBench.
  116. ;
  117. \findtask:
  118.     IFD    V37PLUSONLY
  119.     cmp.w    #$25,20(a6)
  120.     ELSE
  121.     cmp.w    #$24,20(a6)
  122.     ENDIF
  123.     sge    cws_kick20(a4)        ;remember exec version
  124.     cmp.w    #39,20(a6)
  125.     sge    cws_kick30(a4)
  126.     move.l    $114(a6),a0
  127.     move.l    a0,cws_launchtask(a4)    ;remember for child
  128.     move.l    $ac(a0),d6
  129.     seq    cws_wbstartup(a4)    ;remember in flag
  130.     bne    \climode
  131.  
  132. ;------------------
  133. ; Started from WB, get message.
  134. ;
  135. \getwbmsg:
  136.     lea    $5c(a0),a0
  137.     jsr    -384(a6)        ;WaitPort()
  138.     jsr    -372(a6)        ;GetMsg()
  139.     move.l    d0,cws_wbmessage(a4)
  140.  
  141. ;------------------
  142.  
  143.     IFD    cws_V36PLUSONLY
  144. cws_REQUESTER    set    1
  145.  
  146. ;------------------
  147. ; Test if V36+
  148. ;
  149. \testwb20:
  150.     IFND    cws_CLIONLY
  151.     tst.b    cws_kick20(a4)
  152.     bne    \gowb            ;okay!
  153.     bsr.s    \ks20requester
  154.     bra    ReplyWBMsg
  155.     ELSE
  156.     bra    \clirequester
  157.     ENDIF
  158.  
  159. ;------------------
  160. ; Pop up 'KS V36+ only' requester.
  161. ;
  162. \ks20requester:
  163.     lea    \maintext(pc),a1
  164.     lea    \maintext2(pc),a0
  165.     move.l    a0,\pt2-\maintext(a1)
  166.     lea    \text2(pc),a0
  167.     move.l    a0,\pt3-\maintext(a1)
  168.     bra    \requester
  169.  
  170. ;------------------
  171. ; Texts.
  172. ;
  173. \maintext2:
  174.     dc.b    0,0,0,0
  175.     dc.w    10,18
  176.     dc.l    0
  177. \pt3:    dc.l    0    ;text2
  178.     dc.l    0
  179.  
  180.     IFD    V37PLUSONLY
  181. \text2:        dc.b    "needs Kickstart V37+.",0
  182.     ELSE
  183. \text2:        dc.b    "needs Kickstart V36+.",0
  184.     ENDIF
  185.  
  186.     even
  187.  
  188. ;------------------
  189.     ENDIF
  190.  
  191. ;------------------
  192.     ifd    cws_CLIONLY
  193. cws_REQUESTER    set    1
  194.  
  195. ;------------------
  196. ; Pop up 'CLI only' requester.
  197. ;
  198. \clirequester:
  199.     lea    \maintext(pc),a1
  200.     lea    \maintext21(pc),a0
  201.     move.l    a0,\pt2-\maintext(a1)
  202.     lea    \text21(pc),a0
  203.     move.l    a0,\pt5-\maintext(a1)
  204.     bsr    \requester
  205.     bra    ReplyWBMsg
  206.  
  207. ;------------------
  208. ; Texts.
  209. ;
  210. \maintext21:
  211.     dc.b    0,0,0,0
  212.     dc.w    10,18
  213.     dc.l    0
  214. \pt5:    dc.l    0    ;text2
  215.     dc.l    0
  216.  
  217. \text21:    dc.b    "is for CLI usage only.",0
  218.     even
  219.  
  220. ;------------------
  221.     else
  222.  
  223. ;------------------
  224. ; Go to start.
  225. ;    d0=WBMSG
  226. ;
  227. \gowb:    move.l    d0,d7            ;store WBMessage
  228.     IFD    cws_EASYLIB
  229.     bsr    cws_openlibraries    ;all registers unaffected
  230.     beq    ReplyWBMsg
  231.     ENDIF
  232.  
  233.     bsr    OpenDosLib        ;changes D0!!!
  234.     beq.s    \nocd
  235.     move.l    d0,a0            ;DosBase in A0???
  236.     move.l    32(a0),d0        ;sm_ArgList-4(a0=DosBase)
  237.     beq.s    \cddone
  238.     move.l    d0,a0
  239.     move.l    (a0),d1            ;lock on our directory (GARBAGE)
  240.     jsr    -126(a6)        ;CurrentDir()
  241.  
  242.     move.l    d7,a0
  243.     move.l    36(a0),d0        ;sm_ArgList
  244.     beq.s    \cddone
  245.     move.l    d0,a0
  246.     move.l    (a0),d1            ;wa_Lock
  247.     beq.s    \cddone
  248.     jsr    -126(a6)        ;CurrentDir()
  249.  
  250. \cddone:
  251.     bsr    CloseDosLib
  252.  
  253. \nocd:    move.l    cws_wbmessage(pc),d0
  254.  
  255.     IFD    cws_V36PLUSONLY
  256.     move.l    cws_launchtask(a4),a3
  257.     move.l    $bc(a3),cws_homedir(a4)    ;HomeDir...
  258.     ENDIF
  259.  
  260.     move.l    (sp)+,cws_returnaddr(a4)
  261.     jsr    wbstartup(pc)
  262.     move.l    cws_returnaddr(pc),-(sp)
  263.  
  264.     IFD    cws_EASYLIB
  265.     bsr    CloseLibrary
  266.     ENDIF
  267.  
  268.     bra    ReplyWBMsg
  269.  
  270. ;------------------
  271.     endif
  272.  
  273. ;------------------
  274.     ifd    cws_REQUESTER
  275.  
  276. ;------------------
  277. ; Open a requester.
  278. ;    a1=\maintext
  279. ;
  280. \requester:
  281.     lea    \text1(pc),a0
  282.     move.l    a0,\pt1-\maintext(a1)
  283.     lea    \text3(pc),a0
  284.     move.l    a0,\pt4-\maintext(a1)
  285.  
  286.     move.l    4.w,a6
  287.     lea    \intuiname(pc),a1
  288.     jsr    -408(a6)        ;OldOpenLibrary()
  289.     move.l    d0,a6
  290.     tst.l    d0
  291.     beq.s    \requesterend        ;no library, no requester...
  292.  
  293.     suba.l    a0,a0
  294.     moveq    #0,d0
  295.     moveq    #0,d1
  296.     moveq    #30,d2
  297.     lsl.l    #3,d2
  298.     moveq    #64,d3
  299.     lea    \maintext(pc),a1
  300.     suba.l    a2,a2
  301.     lea    \negativetext(pc),a3
  302.     jsr    -348(a6)        ;AutoRequester()
  303.  
  304. \closeintui:
  305.     move.l    a6,a1
  306.     move.l    4.w,a6
  307.     jsr    -414(a6)        ;CloseLibrary()
  308.  
  309. \requesterend:
  310.     rts
  311.  
  312. ;------------------
  313. ; IntuiText structures.
  314. ;
  315. \maintext:
  316.     dc.b    0,0,0,0
  317.     dc.w    10,8
  318.     dc.l    0
  319. \pt1:    dc.l    0    ;text1
  320. \pt2:    dc.l    0    ;maintext2
  321.  
  322. \negativetext:
  323.     dc.b    0,0,0,0
  324.     dc.w    4,3
  325.     dc.l    0
  326. \pt4:    dc.l    0    ;text3
  327.     dc.l    0
  328.  
  329. ;------------------
  330. ; Texts.
  331. ;
  332. \text1:        dc.b    "The program '",gea_progname,"'",0
  333. \text3:        dc.b    " Okay ",0
  334. \intuiname:    dc.b    "intuition.library",0
  335.     even
  336.  
  337. ;------------------
  338.     endif
  339.  
  340. ;------------------
  341.  
  342. ;------------------------------------------------------------------------
  343. ;-    Task Detach                            -
  344. ;------------------------------------------------------------------------
  345.  
  346. ;------------------
  347. ; To the CLI.
  348. ;
  349. \climode:
  350.  
  351. ;------------------
  352.     ifd    cws_V36PLUSONLY
  353.  
  354. ;------------------
  355. ; Test if V36+
  356. ;
  357. \testcli20:
  358.     tst.b    cws_kick20(a4)
  359.     beq    \ks20requester
  360.  
  361. ;------------------
  362.     endif
  363.  
  364. ;------------------
  365.     ifd    cws_DETACH
  366.  
  367. ;------------------
  368. ; Okay, run from CLI or shell: Open dos.library.
  369. ;
  370. \opendos:
  371.     bsr    OpenDosLib
  372.     bne.s    \getcd
  373.     move.w    #fail_nodos,d0
  374.     jsr    Alert(a4)        ;*** failure
  375.     bne.s    \opendos
  376.     bra    \exit
  377.  
  378. ;------------------
  379. ; Get current directory.
  380. ;
  381. \getcd:
  382.     move.l    d0,a6
  383.     moveq    #0,d1
  384.     jsr    -126(a6)        ;CurrentDir()
  385.     move.l    d0,cws_lock(a4)        ;remember for duplock.
  386.     exg.l    d0,d1
  387.     jsr    -126(a6)        ;CurrentDir()
  388.  
  389.     IFD    cws_V36PLUSONLY
  390.     move.l    cws_launchtask(a4),a3
  391.     move.l    $bc(a3),cws_homedir(a4)    ;HomeDir...
  392.     ENDIF
  393.  
  394. ;------------------
  395. ; Count number of segments.
  396. ;
  397. \countsegments:
  398.     lsl.l    #2,d6
  399.  
  400. \againc:moveq    #0,d1
  401.     move.l    d6,a3
  402.     move.l    $3c(a3),d0        ;first segment
  403.     bra.s    \entry
  404.  
  405. \loop:
  406.     addq.l    #1,d1
  407.     move.l    (a0),d0
  408.     beq.s    \gotnumber
  409. \entry:
  410.     lsl.l    #2,d0
  411.     move.l    d0,a0
  412.     bra.s    \loop
  413.  
  414. \gotnumber:
  415.     move.w    d1,cws_segnumber(a4)
  416.  
  417. ;------------------
  418. ; Get enough memory for mementry for all segments.
  419. ;
  420. \getmementrymem:
  421.     addq.l    #2,d1
  422.     lsl.l    #3,d1
  423.     moveq    #1,d0
  424.     exg.l    d0,d1
  425.     move.l    4.w,a6
  426.     jsr    -198(a6)        ;AllocMem()
  427.     move.l    d0,cws_mementry(a4)
  428.     bne.s    \launchproc
  429.     move.w    #fail_nomementry,d0
  430.     jsr    Alert(a4)        ;*** failure
  431.     bne.s    \againc
  432.     bra    \closedos
  433.  
  434. ;------------------
  435. ; Create new process under forbid.
  436. ;
  437. \launchproc:
  438.     jsr    -132(a6)        ;Forbid()
  439.     move.l    cws_launchtask(a4),a2
  440.     lea    $3c(a3),a0
  441.     move.l    (a0),cws_myseg(a4)
  442.     clr.l    (a0)            ;remove all other segments
  443. \againp:pea    \gocli-4(pc)
  444.     move.l    (sp)+,d3        ;routine
  445.     lsr.l    #2,d3
  446.     pea    processname(a4)
  447.     move.l    (sp)+,d1        ;name
  448.     moveq    #0,d2
  449.  
  450.     ifnd    cws_PRI
  451.     move.b    9(a2),d2        ;copy pri of parent
  452.     else
  453.     moveq    #cws_PRI,d2
  454.     endif
  455.  
  456.     ifnd    cws_STACKSIZE
  457.     move.l    $34(a3),d4        ;copy stack longwords
  458.     lsl.l    #2,d4            ;bytes stack
  459.     else
  460.     move.l    #cws_STACKSIZE,d4    ;custom stack size
  461.     endc
  462.     bsr    GetDosBase
  463.     jsr    -138(a6)        ;CreateProc()
  464.  
  465. ;------------------
  466. ; If error occured link mementry in parent process.
  467. ;
  468. \testprocess:
  469.     move.l    d0,a2            ;process ID
  470.     move.l    d0,d3            ;remember this
  471.     bne.s    \insertmem
  472.     move.w    #fail_noprocess,d0
  473.     jsr    Alert(a4)        ;*** failure
  474.     bne.s    \againp
  475.     move.l    cws_launchtask(a4),a2
  476.     lea    $5c(a2),a2        ;link in mementry in own task
  477.  
  478. ;------------------
  479. ; Insert mementry structure.
  480. ;
  481. \insertmem:
  482.     lea    -18(a2),a2        ;start of tc_mementry
  483.     move.l    (a2),a1            ;remember old head
  484.     move.l    cws_mementry(a4),a0
  485.     move.l    a0,(a2)            ;new head in list
  486.     move.l    a0,4(a1)        ;new pred in second node
  487.     move.l    a1,(a0)+        ;next in our node
  488.     move.l    a2,(a0)+        ;pred in our node
  489.     move.w    #$a00,(a0)+        ;type: memory  pri: 0
  490.     clr.l    (a0)+            ;noname
  491.     move.w    cws_segnumber(a4),d7
  492.     move.w    d7,(a0)+        ;#of entries
  493.  
  494. ;------------------
  495. ; Fill it out.
  496. ;
  497. \fillout:
  498.     subq.w    #1,d7
  499.     move.l    cws_myseg(pc),a1
  500.  
  501. \fillloop:
  502.     add.l    a1,a1
  503.     add.l    a1,a1
  504.     subq.l    #4,a1
  505.     move.l    a1,(a0)+        ;address
  506.     move.l    (a1)+,(a0)+        ;length
  507.     move.l    (a1)+,a1
  508.     dbra    d7,\fillloop
  509.  
  510. ;-------------------
  511. ; Now, all went fine(d3<>0)?.
  512. ;
  513. \didwe:
  514.     tst.l    d3
  515.     beq    \noforbid
  516.  
  517. ;------------------
  518. ; Send message to child. Send first message to process port, others
  519. ; to custom port.
  520. ;
  521. \sendmsg:
  522.     st.b    cws_sync(a4)        ;we begin...
  523.     move.l    d3,cws_portptr(a4)
  524.     
  525. \sendmsgloop:
  526.     move.l    cws_launchtask(pc),a2
  527.     lea    $5c(a2),a2
  528.     move.l    cws_portptr(pc),a0
  529.     lea    cws_messy(pc),a1
  530.     move.l    a2,14(a1)        ;replyport...
  531.     move.l    4.w,a6
  532.     jsr    -366(a6)        ;PutMsg()
  533.  
  534. ;------------------
  535. ; Wait for reply.
  536. ;
  537. \wait:
  538.     move.l    a2,a0
  539.     jsr    -384(a6)        ;WaitPort()
  540.     move.l    a2,a0
  541.     jsr    -372(a6)        ;GetMsg()
  542.     move.l    d0,a0
  543.     lea    cws_messy(pc),a1
  544.     move.l    20(a0),d0
  545.     beq.s    \sendend
  546.  
  547. ;------------------
  548. ; Permit, call routine, forbid and wait for nilroutine messy.
  549. ;
  550. \call:
  551.     pea    \rts(pc)
  552.     move.l    d0,-(sp)
  553.     jmp    -138(a6)        ;Permit() and then routine
  554. \rts:
  555.     jsr    -132(a6)
  556.     bra    \sendmsgloop
  557.  
  558. ;------------------
  559. ; Send final message to child.
  560. ;
  561. \sendend:
  562.     move.l    cws_portptr(pc),a0
  563.     lea    cws_messy(pc),a1
  564.     jsr    -366(a6)        ;PutMsg()
  565.  
  566. ;------------------
  567. ; Prepare to Permit().
  568. ;
  569. \noforbid:
  570.     pea    -138(a6)        ;Permit()
  571.  
  572. ;------------------
  573. ; Close dos.library.
  574. ;
  575. \closedos:
  576.     bsr    CloseDosLib
  577.  
  578. ;------------------
  579. ; Leave this code.
  580. ;
  581. \exit:
  582.     movem.l    cws_regs(a4),d0-a5    ;a6=[4] for permit()!
  583.     move.l    cws_returnvalue(pc),d0    ;returnvalue
  584.     rts
  585.  
  586. ;--------------------------------------------------------------------
  587. ; Patch return address, handle locks and go to cli (foreign task territory).
  588. ;
  589. \makebcpl:
  590.     align.l                ;because of BCPL
  591.     dc.l    0,0            ;some monitors crash when this is not here
  592.  
  593. \gocli:    lea    cws_base(pc),a4
  594.     lea    cws_returnaddr(pc),a0
  595.     move.l    (sp)+,(a0)        ;remember real return
  596.     move.l    4.w,a6
  597.     move.l    $114(a6),a0
  598.     move.l    $80(a0),d0
  599.     beq.s    \openport
  600.     lsl.l    #2,d0
  601.     move.l    d0,a0
  602.     move.l    cws_myseg(pc),$c(a0)        ;copy segment list.
  603.  
  604. ;------------------
  605. ; Open new port and fail if not.
  606. ;
  607. \openport:
  608.     lea    cws_port(pc),a0
  609.     bsr    MakePort
  610.     bne.s    \gotport
  611.     move.w    #fail_nostartp,d0
  612.     jsr    Alert(a4)        ;*** failure
  613.     bne.s    \openport
  614.  
  615. \bad:    suba.l    a0,a0
  616.     bsr    ReplySync
  617.     bra    \fexit
  618.  
  619. \gotport:
  620.     lea    cws_dummy(pc),a0
  621.     bsr    ReplySync
  622.  
  623. ;------------------
  624. ; Change directory to the new lock.
  625. ;
  626. \changedir:
  627.     bsr    OpenDosLib        ;the child will free it when ending
  628.     move.l    d0,a6            ;it exists, parent has it still open
  629.     move.l    cws_lock(pc),d1
  630.     beq.s    \lockduped
  631.     jsr    -96(a6)            ;DupLock()
  632.     move.l    d0,d1
  633.     move.l    d0,cws_lock(a4)
  634.     move.l    d0,cws_currentdir(a4)
  635.  
  636. \lockduped:
  637.     jsr    -126(a6)        ;CurrentDir() DOES NOT USE MSGS!
  638.  
  639.     IFD    cws_V36PLUSONLY
  640.     move.l    cws_homedir(pc),d1
  641.     beq.s    \nghd
  642.     jsr    -96(a6)            ;DupLock()
  643.     move.l    d0,cws_homedir(a4)
  644.     move.l    4.w,a6
  645.     move.l    $114(a6),a4
  646.     move.l    d0,$bc(a4)
  647. \nghd:    ENDIF
  648.  
  649.     IFD    cws_EASYLIB
  650.     bsr    cws_openlibraries
  651.     bne.s    \go
  652.     suba.l    a0,a0
  653.     bsr    ReplySync
  654.     bra.s    \unlock
  655.  
  656.     ENDIF
  657.  
  658. \go:    movem.l    cws_regs(pc),d0-a6
  659.     jsr    clistartup(pc)        ;GO!
  660.  
  661.     IFD    cws_EASYLIB
  662.     bsr    CloseLibrary
  663.     ENDIF
  664.  
  665. ;------------------
  666. ; Unlock DupLock()ed struct
  667. ;
  668. \unlock:
  669.     movem.l    d0-a6,-(sp)
  670.  
  671.     IFD    cws_V36PLUSONLY
  672.     move.l    cws_homedir(pc),d1
  673.     beq.s    \nhd
  674.     bsr    GetDosBase
  675.     jsr    -90(a6)            ;Unlock()
  676.     move.l    4.w,a6
  677.     move.l    $114(a6),a4
  678.     clr.l    $bc(a4)
  679.     
  680. \nhd:    ENDIF
  681.  
  682.     move.l    cws_lock(pc),d1
  683.     beq.s    \nlock
  684.     bsr    GetDosBase
  685.     jsr    -90(a6)            ;Unlock()
  686.     moveq    #0,d1
  687.     jsr    -126(a6)        ;ChangeDir()
  688.  
  689. \nlock:    bsr    CloseDosLib
  690.  
  691.     movem.l    (sp)+,d0-a6
  692.  
  693. \fexit:    move.l    cws_returnaddr(pc),-(sp)
  694.     rts
  695.  
  696. ;------------------
  697.  
  698. ;------------------------------------------------------------------------------
  699. *
  700. * ReplySync    Reply to startup message and set routine.
  701. *
  702. * INPUT:    a0    Address of routine to be called
  703. *
  704. * RESULT:    Waits for startup message and replies to it, setting
  705. *        the routine field to d0. Then it waits again for a
  706. *        message. This routine can be called without concideration
  707. *        of WB or CLI start or if ReplySync already terminated.
  708. *
  709. ;------------------------------------------------------------------------------
  710.  
  711. ;------------------
  712. ReplySync:
  713.  
  714. ;------------------
  715. ; Get task address.
  716. ;
  717. \start:
  718.     movem.l    d0-a6,-(sp)
  719.     lea    cws_wbstartup(pc),a3
  720.     tst.b    (a3)            ;from WB?
  721.     bne.s    \exit
  722.     move.b    cws_sync(pc),d0        ;done yet?
  723.     beq.s    \exit
  724.     move.l    a0,a3
  725.     move.l    4.w,a6
  726.     move.l    cws_portptr(pc),a2
  727.  
  728. ;------------------
  729. ; Wait for messy and test if it is 'messy'.
  730. ;
  731. \wait:
  732.     move.l    a2,a0
  733.     jsr    -384(a6)        ;WaitPort()
  734.     move.l    a2,a0
  735.     jsr    -372(a6)        ;GetMsg()
  736.     tst.l    d0
  737.     beq.s    \wait
  738.     move.l    d0,a1
  739.     lea    cws_messy(pc),a0
  740.     cmp.l    a0,a1
  741.     bne.s    \wait
  742.     pea    cws_dummy(pc)
  743.     cmp.l    (sp)+,a3
  744.     bne.s    \nodummy
  745.     lea    cws_portptr(pc),a0
  746.     pea    cws_port(pc)
  747.     move.l    (sp)+,(a0)        ;set new port to use.
  748.  
  749. \nodummy:
  750.     move.l    a3,20(a1)
  751.     jsr    -378(a6)        ;ReplyMsg()
  752.  
  753. ;------------------
  754. ; Now wait again, either for next messy or for final messy.
  755. ; If final messy, get it so DOS can then use port for IO.
  756. ;
  757. \again
  758.     move.l    cws_portptr(pc),a2
  759.     move.l    a2,a0
  760.     jsr    -384(a6)        ;WaitPort()
  761.     move.l    a3,d0
  762.     bne.s    \exit
  763.     move.l    a2,a0
  764.     jsr    -372(a6)        ;GetMsg()
  765.     lea    cws_port(pc),a0
  766.     bsr    UnMakePort
  767.     lea    cws_sync(pc),a0
  768.     clr.b    (a0)
  769.  
  770. ;------------------
  771. ; Exit.
  772. ;
  773. \exit:
  774.     movem.l    (sp)+,d0-a6
  775.     rts
  776.  
  777. ;------------------
  778.  
  779. ;--------------------------------------------------------------------
  780.  
  781. ;------------------
  782. ; Data only used by detaching startup.
  783. ;
  784.  
  785. ;------------------
  786.     include    alert.r
  787.     include    ports.r
  788.  
  789. ;------------------
  790.     AddAlert_    fail_nodos,"Unable to open dos.library"
  791.     AddAlert_    fail_nomementry,"No memory for mementry struct"
  792.     AddAlert_    fail_noprocess,"Unable to create process"
  793.     AddAlert_    fail_nostartp,"Unable to create port"
  794.  
  795. ;------------------
  796. ; Startup message.
  797. ;
  798. cws_messy:    dc.l    0,0
  799.         dc.b    05,0
  800.         dc.l    0
  801.         dc.l    0    ;replyport
  802.         dc.w    24    ;length
  803. cws_routine:    dc.l    0    ;routine to be called
  804.  
  805. cws_dummy:    rts        ;dummy routine for port switch
  806.  
  807. ;------------------
  808. ; Second port.
  809. ;
  810. cws_port:
  811.     ds.b    10,0
  812.     dc.l    0        ;no name
  813.     dc.b    0,0        ;flag,sigbit
  814.     dc.l    0        ;sigtask
  815.     ds.b    14,0        ;MSG list
  816.  
  817. ;------------------
  818. cws_portptr:    dc.l    0
  819. cws_myseg:    dc.l    0
  820. cws_mementry:    dc.l    0
  821. cws_lock:    dc.l    0
  822. cws_currentdir:    dc.l    0
  823. cws_segnumber:    dc.w    0
  824. cws_sync:    dc.b    0
  825.         dc.b    0
  826. cws_returnvalue:dc.l    0
  827.  
  828. ;------------------
  829.  
  830. ;--------------------------------------------------------------------
  831.  
  832. ;------------------
  833.     else    
  834.  
  835. ;------------------
  836. ; Simply go to start.
  837. ;
  838. \gocli:
  839.     IFD    cws_EASYLIB
  840.     moveq    #0,d0
  841.     bsr    cws_openlibraries
  842.     beq.s    \nogo
  843.     ENDIF
  844.  
  845.     IFD    cws_V36PLUSONLY
  846.     move.l    cws_launchtask(a4),a3
  847.     move.l    $bc(a3),cws_homedir(a4)    ;HomeDir...
  848.     ENDIF
  849.  
  850.     move.l    (sp)+,cws_returnaddr(a4)
  851.     movem.l    cws_regs(a4),d0-a6
  852.     jsr    clistartup(pc)
  853.     move.l    cws_returnaddr(pc),-(sp)
  854.  
  855.     IFD    cws_EASYLIB
  856.     bsr    CloseLibrary
  857.     ENDIF
  858.  
  859. \nogo:    rts
  860.  
  861. ;------------------
  862.     endif
  863.  
  864. ;------------------
  865.  
  866. ;------------------------------------------------------------------------------
  867. *
  868. * ReplyWBMsg    Reply to workbench message and go forbid.
  869. *
  870. * RESULT:    Replies to cws_wbmessage and calls Forbid() because the WB
  871. *        imediately frees the process memory. This routine can be
  872. *        called without concideration of WB or CLI start.
  873. *
  874. ;------------------------------------------------------------------------------
  875.  
  876. ;------------------
  877. ReplyWBMsg:
  878.  
  879. ;------------------
  880. ; Start.
  881. ;
  882. \start:
  883.     movem.l    d0-a6,-(sp)
  884.     lea    cws_wbstartup(pc),a0
  885.     tst.b    (a0)            ;from CLI?
  886.     beq.s    \exit
  887.  
  888.     lea    cws_wbmessage(pc),a1
  889.     move.l    (a1),d0
  890.     beq.s    \exit
  891.     clr.l    (a1)
  892.     move.l    d0,a1
  893.  
  894.     move.l    4.w,a6
  895.     jsr    -132(a6)        ;ReplyMsg frees segments!
  896.     jsr    -378(a6)        ;ReplyMsg()
  897.  
  898. ;------------------
  899. ; End.
  900. ;
  901. \exit:
  902.     movem.l    (sp)+,d0-a6
  903.     rts
  904.  
  905. ;------------------
  906. ; Data always used.
  907. ;
  908. cws_wbstartup:    dc.b    0    ;-1 for WB, 0 for CLI
  909. cws_kick20:    dc.b    0    ;-1 for 2.0+, 0 for 1.2/1.3
  910. cws_kick30:    dc.b    0    ;-1 for 3.0+, 0 for lower
  911.         dc.b    0
  912. cws_launchtask:    dc.l    0
  913. cws_wbmessage:    dc.l    0
  914. cws_returnaddr:    dc.l    0
  915. cws_regs:    ds.l    15,0
  916.     IFD    cws_V36PLUSONLY
  917. cws_homedir:    dc.l    0
  918.     ENDIF
  919.  
  920. ;------------------
  921.     include    doslib.r
  922.  
  923. ;------------------
  924.  
  925. ;--------------------------------------------------------------------
  926.  
  927.     IFD    cws_EASYLIB
  928. ;------------------
  929.  
  930. ely_NOALERT    SET    1
  931.     include    easylibrary.r
  932.     include    alert.r
  933.  
  934. cws_alerttext:
  935.     AddAlert_    fail_nolibs,"Could not open                            "
  936.  
  937. ;------------------
  938. ; Open libs wanted and display alert if one fails!
  939. ;
  940. ;    ccr=>EQ if failed
  941. ;
  942. cws_openlibraries:
  943.     movem.l    d0-a6,-(sp)
  944.  
  945. \again:    bsr    OpenLibrary
  946.     tst.l    d0
  947.     bne.s    \done
  948.     bsr    CloseLibrary
  949.     lea    cws_alerttext+15(pc),a1
  950. \loop:    move.b    (a0)+,(a1)+
  951.     bne.s    \loop
  952.     move.w    #fail_nolibs,d0
  953.     bsr    Alert
  954.     bne.s    \again
  955.  
  956. \done:    movem.l    (sp)+,d0-a6
  957.     rts
  958.  
  959. ;------------------
  960.     ENDIF
  961.  
  962. ;--------------------------------------------------------------------
  963.  
  964. ;------------------
  965.     base    cws_oldbase
  966.  
  967. ;------------------
  968.     endif
  969.  
  970.     end
  971.  
  972.